#include<stdio.h>
#include<unistd.h>
//nclude <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>

int main() {
    // 1. 保存原始的标准输入和输出（用于后续恢复）
    int stdin_backup = dup(0);  // 保存原始stdin（fd=0）
    int stdout_backup = dup(1); // 保存原始stdout（fd=1）
    if (stdin_backup == -1 || stdout_backup == -1) {
        perror("dup failed");
        exit(EXIT_FAILURE);
    }

    // 2. 打开目标文件（输入来源和输出目的地）
    int input_fd = open("input.txt", O_RDONLY);  // 输入文件（只读）
    int output_fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);  // 输出文件
    if (input_fd == -1 || output_fd == -1) {
        perror("open failed");
        exit(EXIT_FAILURE);
    }

    // 3. 执行重定向
    // 将标准输入（fd=0）重定向到input.txt
    if (dup2(input_fd, 0) == -1) {
        perror("dup2 input failed");
        exit(EXIT_FAILURE);
    }
    // 将标准输出（fd=1）重定向到output.txt
    if (dup2(output_fd, 1) == -1) {
        perror("dup2 output failed");
        exit(EXIT_FAILURE);
    }

    // 4. 此时的I/O操作会使用重定向后的文件
    printf("=== 开始处理输入 ===\n");  // 会写入output.txt

    char buffer[1024];
    ssize_t n;
    // 从"标准输入"读取（实际是input.txt）
    while ((n = read(0, buffer, sizeof(buffer)-1)) > 0) {
        buffer[n] = '\0';
        // 向"标准输出"写入（实际是output.txt）
        printf("处理后: %s", buffer);
    }

    printf("=== 处理结束 ===\n");  // 会写入output.txt

    // 5. 关闭临时文件描述符
    close(input_fd);
    close(output_fd);

    // 6. 恢复原始的输入输出
    dup2(stdin_backup, 0);   // 恢复stdin
    dup2(stdout_backup, 1);  // 恢复stdout
    close(stdin_backup);     // 关闭备份的描述符
    close(stdout_backup);

    // 验证恢复效果（输出到终端）
    printf("程序执行完毕，原始输入输出已恢复\n");
    printf("请输入任意内容（将显示在终端）: ");
    fflush(stdout);
    if (fgets(buffer, sizeof(buffer), stdin) != NULL) {
        printf("你输入了: %s", buffer);
    }

    return 0;
}
//{
//    printf("%d",getpid());
//    return  0;
//}
